博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
QTextEdit显示超链接
阅读量:4070 次
发布时间:2019-05-25

本文共 3462 字,大约阅读时间需要 11 分钟。

因为工程中需要用到QTextEdit来显示超链接,并点击后需要打开,在网上查了好多也没有一个好的解决办法。

自己想办法解决后将思路分享给大家,我这一次也不做伸手党了。奋斗
上代码:

TextEdit * textEdit;QList< pair
>strArray;unordered_map
urlIndex;
解释一下 textEdit是自己封装的输入框,继承于QTextEdit;

strArray中存储着将传入的完整字符串拆分成超链接和普通字符串后的字符串数组,true表示是超链接

urlIndex中存储了显示的文本中超链接中每一个字符对应着超链接的index.

QString CCLChatTextItemForm::GetlinkUrl(const QString &str){    return ""+str+"";}//#define LINK_RegulaString "((http[s]{0,1}|ftp)://[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)|(www.[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)"//将普通网址改为html文本,显示下划线样式 蓝色void CCLChatTextItemForm::SetTextContent(const QString &str){    QString content = str;    QRegExp regexp(LINK_RegulaString);    int pos = content.indexOf(regexp);    while(pos>=0){        if(pos==0){            QString tmp = content.mid(0,regexp.matchedLength());            content = content.mid(regexp.matchedLength());            strArray.push_back(make_pair(tmp,true));        }else{            QString tmp1 = content.mid(0,pos);            QString tmp2 = content.mid(pos,regexp.matchedLength());            content = content.mid(pos+regexp.matchedLength());            strArray.push_back(make_pair(tmp1,false));            strArray.push_back(make_pair(tmp2,true));        }        pos = content.indexOf(regexp);    }    if(content.size()>0)        strArray.push_back(make_pair(content,false));    for(int i=0;i
t = strArray.at(i);        if(t.second == false)            this->textEdit->setUcs4String(t.first);        else{            int count = this->textEdit->toPlainText().size();            this->textEdit->append(this->GetlinkUrl(t.first));            int len = this->GetlinkUrl(t.first).size();            for(int j = count;j
=0){ if(pos==0){ QString tmp = content.mid(0,regexp.matchedLength()); content = content.mid(regexp.matchedLength()); strArray.push_back(make_pair(tmp,true)); }else{ QString tmp1 = content.mid(0,pos); QString tmp2 = content.mid(pos,regexp.matchedLength()); content = content.mid(pos+regexp.matchedLength()); strArray.push_back(make_pair(tmp1,false)); strArray.push_back(make_pair(tmp2,true)); } pos = content.indexOf(regexp); } if(content.size()>0) strArray.push_back(make_pair(content,false)); for(int i=0;i
t = strArray.at(i); if(t.second == false) this->textEdit->setUcs4String(t.first);//这段代码自己封装的 为了解析特殊表情,相当于settext else{ int count = this->textEdit->toPlainText().size(); this->textEdit->append(this->GetlinkUrl(t.first)); int len = this->GetlinkUrl(t.first).size(); for(int j = count;j
//另外在textEdit中重写鼠标释放事件
//别忘了在构造函数中和析构函数中设置鼠标跟踪属性this->setMouseTracking(true);void TextEdit::mouseReleaseEvent(QMouseEvent *){    int index = this->textCursor().anchor();//得到当前光标点击的位置在文本中的第几个    emit SignalOpenUrl(index);}connect(this->textEdit,SIGNAL(SignalOpenUrl(int)),this,SLOT(SlotlOpenUrl(int)));//连接void CCLChatTextItemForm::SlotlOpenUrl(int index){    if(urlIndex.find(index) == this->urlIndex.end() )        return;    QString urlString = this->strArray.at(urlIndex[index]).first;    QDesktopServices::openUrl(QUrl(urlString));}//处理 ,至此超链接功能就写完了,总体思路是拆分字符串,确定每个超链接字符的位置,然后根据光标摁下获得的位置来取得字符串,再用QDesktopServices::openUrl(QUrl(urlString));打开

你可能感兴趣的文章
MouseEvent的e.stageX是Number型,可见as3作者的考虑
查看>>
在mc中直接加aswing组件,该组件还需最后用validate()方法
查看>>
移植Vim配色方案到Eclipse
查看>>
从超链接调用ActionScript
查看>>
谈谈加密和混淆吧[转]
查看>>
TCP的几个状态对于我们分析所起的作用SYN, FIN, ACK, PSH,
查看>>
网络游戏客户端的日志输出
查看>>
关于按钮的mouseOver和rollOver
查看>>
《多线程服务器的适用场合》例释与答疑
查看>>
Netty框架
查看>>
Socket经验记录
查看>>
对RTMP视频流进行BitmapData.draw()出错的解决办法
查看>>
FMS 客户端带宽计算、带宽限制
查看>>
在线视频聊天(客服)系统开发那点事儿
查看>>
SecurityError Error 2148 SWF 不能访问本地资源
查看>>
Flex4的可视化显示对象
查看>>
Flex:自定义滚动条样式/隐藏上下箭头
查看>>
烈焰SWF解密
查看>>
Qt 静态编译后的exe太大, 可以这样压缩.
查看>>
3D游戏常用技巧Normal Mapping (法线贴图)原理解析——基础篇
查看>>